\section{Modo Protegido}
\label{sec:modo-protegido}

\subsection{Bus de direcciones}
Por cuestiones de compatibilidad el procesador 8086 arranca en lo que se denomina \textbf{Modo Real},  podemos direccionar 
cierta cantidad acotada de posiciones de memoria, y solo contamos con algunas instrucciones y modos de direccionaniento de todos los que ofrece la arquitectura. Dicho modo no utiliza el bus de direcciones en su totalidad (20 lineas), para habilitarlo debemos activar el pin \textbf{A20}, de esta manera podremos direccionar hasta 2$^{20}$ direcciones.

Para realizar esta tarea utilizamos las funciones provistas por la c'atedra en el siguiente orden:

\begin{itemize}
\item[a)] deshabilitar A20.
\item[b)] checkear$\_$A20.
\item[c)] call habilitar$\_$A20
\item[d)] checkear$\_$A20
\end{itemize}

De esta manera pudimos corroborar el correcto funcionamiento de las rutinas y revisar el estado final despues de la habilitaci'on.

\subsection{Segmentaci'on}

El \textbf{Modo Protegido} de esta arquitectura provee segmentaci'on para la administraci'on de memoria. Esta caracter'istica no puede ser evitada, por lo que vamos a definir segmentos solapados de m'axima longitud para los datos y el c'odigo. Adem'as definiremos un segmento espec'ifico para la memoria de video (ES).

Para definir estos segmentos necesitamos de lo que se denomina \textbf{tabla de descriptores} (GDT), una estructura especificamente dedicada a almacenar informaci'on sobre los mismos. Cada descriptor a su vez provee informaci'on acerca de cada segmento de 
datos, c'odigo, video, interrupciones o alg'un otro que pueda necesitar el procesador. 

La tabla de descriptores fue completada con lo siguiente: un segmento para c'odigo en el 'indice 6 de la tabla, otro para datos en el indice 4, y por 'ultimo el 'indice 2 guarda el segmento encargado de direccionar la memoria de video. En el cuadro \ref{tab:gdt} podemos ver como queda la tabla\footnote{Para m'as informaci'on acerca de los atributos de descriptores de segmento remitirse a los comentarios en el c'odigo del archivo gdt.c.}.

\begin{table}[H]
\begin{center}
\begin{tabular}{|c|c|c|}
\hline
\sc{'indice} & \sc{ selector} & \sc{ segmento}\\ \hline
0  & 0x0  & NULL\\ \hline
2  & 0x10& Video\\ \hline
4  & 0x20 & Datos\\ \hline
6  & 0x30& C'odigo\\ \hline
\end{tabular}
\caption{Entradas en la tabla GDT}
\label{tab:gdt}
\end{center}
\end{table}

Para escribir estos descriptores se utiliz'o la esctuctura GDT\_ENTRY provista por la c'atedra y llenando cada entrada de la GDT de manera est'atica, todo en lenguaje C.

Los atributos definidos en los descriptores para cada segmento que merecen ser destacados son los siguientes:
\paragraph*{Video}
	\begin{itemize}
  		\item Granularidad: este bit esta en 0 lo que indica que el campo limite se mide en bytes.
		\item Type: Read/write (0x2).
		\item Present: 1 porque el segmento se encuentra presente en memoria.
		\item DPL: se corresponde con el nivel de privilegio. Se instancia en cero, que a pesar de ser el menor num'erico es el mayor privilegio.
	    \item Limite: se setea en 0xF9F dado que la memoria de video accede a 80 filas y 25 columnas de 2 bytes cada una, sin embargo el limite es la 'ultima posici'on direccionable o donde se puede escribir, osea 80*25*2 -1 = 3999= 0xF9F.
	\end{itemize}

\paragraph*{C'odigo}
	\begin{itemize}	
		\item Granularidad: este bit esta en 1 lo que indica que el campo limite se mide en p'aginas de 4k.
		\item Type: Execute/Read (0xA).
		\item Present: 1 porque el segmento se encuentra presente en memoria.
		\item DPL : Se corresponde con el nivel de privilegio, se instancia en cero que a pesar de ser el menor num'erico es el mayor privilegio.
		\item Limite: Por que usamos \textit{modelo flat}, el limite es toda la memoria f'isica entonces se instancia en  0xFFFF( no olvidar que se mide en p'aginas de 4k).
	\end{itemize}
	
\paragraph*{Datos}
	\begin{itemize}	
		\item Granularidad: este bit esta en 1 lo que indica que el campo limite se mide en p'aginas de 4k.
		\item Type: Read/Write (0x2).
		\item Present: 1 porque el segmento se encuentra presente en memoria.
		\item DPL : Se corresponde con el nivel de privilegio, se instancia en cero que a pesar de ser el menor num'erico es el mayor privilegio.
		\item Limite: Por que usamos \textit{modelo flat}, el limite es toda la memoria f'isica entonces se instancia en  0xFFFF( no olvidar que se mide en p'aginas de 4k).
	\end{itemize}	


Luego de completar la GDT cargamos la direcci'on f'isica del inicio de la tabla en el registro GDTR con la instrucci'on LGDT. Con esto el procesador puede acceder a la informacion de 'esta tabla en cualquier momento para realizar sus mecanismo autom'aticos. Este fue el 'ultimo paso previo necesario para activar el modo protegido del procesador.

\subsection{Activando Modo Protegido}

Los registros de control determinan el modo de operar del procesador. Para activar este modo debemos cambiar el primer bit del registro de control cr0 (bit de \textit{protected}). Sin embargo no podemos aplicar operaciones de bits entre registros de control e inmediatos, puesto que no esta permitido. Por lo tanto debemos mudar el cr0 a un registro, instanciar el bit de protecci'on en uno y luego mover el valor de ese registro nuevamente al registro de control.

Despu'es de esto, tecnicamente, el cambio ya esta realizado. Sin embargo hay que tener cuidado ya que los registros de segmento no se encuentran bien cargados pues ahora deberian convertirse en selectores de la GDT. Por lo tanto, la primera medida es cambiar el registro de segmento de c'odigo para poder seguir nuestro hilo de ejecuci'on. Sin embargo, la arquitectura no permite utilizar las operaciones de movimiento de datos sobre el registro CS. Entonces para cambiar su contenido debemos realizar un salto (\texttt{jmp far}) especificando como segmento al 'indice que se corresponde con la entrada corecta en la GDT(descriptor de c'odigo).

El formato de dicho 'indice es llamado selector de segmento y del tercer bit en adelante indica el 'indice, mientras que el segundo bit a que tabla corresponde (al ser GDT sera 0). Los dos bits menos significativos corresponden al nivel de privilegio(RPL) del selector. Por lo tanto en nuestro caso, como el 'indice es 6 pero hay tres bits en 0 el selector ser'a el num'erico 0x30.

Luego cargamos todos los selectores con segmento de datos excepto el ES que contiene el de la memoria de video, lo elegimos asi porque porque 
para imprimir usamos funciones de string como \textit{stosd} que usa ES como registro impl'icito. 

Adem'as instanciamos los registros de la pila(EBP y ESP), apuntando la base al inicio de la memoria de kernel y despu'es apuntando el stack a la misma. Esto es importante para poder devolver o hacer un seguimiento de la pila, m'as adelante.

Luego utilizando nuestro nuevo selector ES recorrimos la memoria de video escribiendo caracteres nulos, en blanco sobre negro. Cabe recordar que el formato que la arquitectura propone para cada caracter de pantalla esta compuesto por dos bits, uno para el modo (colores de letra y fondo) y otro para le caracter en formato ascii. Una vez hecho esto imprimimos las lineas blancas del tope y fondo de pantalla, y por encima de esta el 
mensaje con la secuencia de numeros del 0 hasta el 9.

\textbf{Observaci'on:} Modificamos los nombres de las etiquetas en macrosmodoprotegido.mac para poder incluir en un mismo archivo las macros en modo real y modo protegido. Eso nos permite hacer las impresiones en pantalla del ejercicio desde el archivo kernel.asm con la macro \texttt{IMPRIMIR$\_$TEXTO} definida en el archivo modificado.

\subsection{Preguntas}
\paragraph*{Pregunta 1:} ?`Qu'e ocurre si se intenta escribir en la fila 26, columna 1 de la matriz de
video utilizando el usando el segmento de la GDT que direcciona a la memoria de video? ?` Por qu'e? \\
\textbf{Respuesta:} La fila 26, columna 1 de la matriz de video corresponde a la direccion $25 \times 80 \times 2=$ 0xFA0. Como vimos anteriormente esta direccion de memoria no esta dentro del rango definido por el segmento de video. Es mas, es justamente la posicion de memoria siguiente a la 'ultima. Para constarlo lo que hicimos fue escribir en dicha posicion de memoria usando como selector a ES. El resultado obtenido fue un mensaje de error de protecci'on general, algo esperable ya que estamos queriendo acceder a un segmento fuera del l'imite permitido.



 










